/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Objetos.Cliente;
import Objetos.Usuario;
import DAO.AccessDatabase;
import java.awt.HeadlessException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celio
 */
public class RepositorioCliente implements RepositorioClienteInterface {

    @Override
    public void adicionar(Cliente cli, Usuario usu) {
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `clientes`(nomecliente,emailcliente,numeroCadastro,telefone, locadora) VALUES('" + cli.getNome() + "','" + cli.getEmail() + "','" + cli.getNumeroCadastro()+ "','" + cli.getTelefone() + "','" + cli.getLocadora() + "')");
            con.close();

            JOptionPane.showMessageDialog(null, "Cliente cadastrado com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Adicionou o Cliente:  " + cli.getNome() + " às ");

        } catch (SQLException | HeadlessException t) {
            System.out.println(t.getMessage());

        }
    }

    @Override
    public void alterar(String cod, Cliente cli, Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.executeUpdate("UPDATE clientes SET nomecliente='" + cli.getNome() + "',emailcliente='" + cli.getEmail() + "',numeroCadastro='" + cli.getNumeroCadastro() + "',telefone='"+ cli.getTelefone()+ "',locadora='" + cli.getLocadora()+ "' WHERE idcliente = '" + cod + "'");
            con.close();

            JOptionPane.showMessageDialog(null, "Cliente alterado com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Alterou o Cliente:  " + cli.getNome() + " às ");

        } catch (SQLException | HeadlessException t) {
            System.out.println(t.getMessage());

        }

    }

    @Override
    public Cliente procurar(String codnul,Usuario usu) {
        try {

            AccessDatabase a = new AccessDatabase();
            Cliente cli;
            try (Connection con = a.conectar()) {
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM `clientes` WHERE idcliente = '"+codnul+"'");
                rs.next();
                cli = new Cliente();
                cli.setCod_cliente(codnul);
                cli.setNome(rs.getString("nomecliente"));
                cli.setEmail(rs.getString("emailcliente"));
                cli.setNumeroCadastro(rs.getString("numeroCadastro"));
                cli.setTelefone(rs.getString("telefone"));
                cli.setLocadora(rs.getString("locadora"));
            }
            return cli;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }
    }

    @Override
    public Cliente procurarPeloNumCadastro(String numCadastro,Usuario usu) {
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `clientes` WHERE numeroCadastro = '" + numCadastro + "'");
            
            if(rs.next()){
            Cliente cli = new Cliente();
            cli.setCod_cliente(rs.getString("idcliente"));
            cli.setNome(rs.getString("nomecliente"));
            cli.setEmail(rs.getString("emailcliente"));
            cli.setTelefone(rs.getString("telefone"));
            cli.setNumeroCadastro(rs.getString("numeroCadastro"));
            cli.setLocadora(rs.getString("locadora"));
           
            con.close();
            return cli;
            }else{
                return null;
            }
        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }
    }

    @Override
    public Cliente procurarNome(String nome,Usuario usu) {
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `clientes` WHERE nomecliente = '" + nome + "'");
            rs.next();

            Cliente cli = new Cliente();
            cli.setNome(rs.getString("nomecliente"));
            cli.setTipo(rs.getString("tipocliente"));
            cli.setNumeroCadastro(rs.getString("numerocadastrocliente"));
            cli.setEmail(rs.getString("emailcliente"));

            con.close();
            return cli;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }
    }

    @Override
    public JTable listarTodos(Usuario usu) {
        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT idcliente, nomecliente, emailcliente, numeroCadastro, telefone FROM `clientes`");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("Código");
            cabecalho.addElement("Nome");
            cabecalho.addElement("Email");
            cabecalho.addElement("Cadastro");
            cabecalho.addElement("Telefone");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(180);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(120);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(100);

            con.close();
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public Cliente verificarExistente(String nome,Usuario usu) {
        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `clientes` WHERE nomecliente = ('" + nome + "')");
            rs.next();
            Cliente cli = new Cliente();
            try {
                cli.setCod_cliente(rs.getString("idcliente"));
                cli.setNome(rs.getString("nomecliente"));
                con.close();
                return cli;

            } catch (SQLException ez) {

                con.close();
                cli.setNome("");
                return cli;
            }

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public JTable listarClientes(String ref,Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT cod_emp,nome,valor,juros,pagou,data_emp,data_pag,garantia,status,pagamento,valor_rec FROM Emprestimos WHERE nome=('" + ref + "') ORDER BY data_emp desc");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("Código");
            cabecalho.addElement("Nome");
          
            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            con.close();
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }
    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

}
